home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / conhlp03 / progsort.bat < prev    next >
DOS Batch File  |  1995-01-22  |  9KB  |  337 lines

  1. rem progsort.bat
  2. rem フリコレの作品名をソート [keyword]パターン付き
  3.  
  4. rem 必要なもの ()内は置き換え可
  5. rem (jg)awk.exe sed.exe sort.awk(sort.exe)
  6. rem lha.exe fswidx.lzh : [5-9].idx(helper.idx を リネームしてフリーズ)
  7. rem usage : progsort file          -- 必要ファイルの分離のみ
  8. rem         progsort init [idx]..  -- keyw.cfg を 消して再作成
  9. rem         progsort   -  [idx]..  -- keyw.cfg にもとづいて作成
  10. rem         [idx].. -- 5,6 7 のように spase または ',' で分けて記述
  11. rem                    記述無ければ 5-9 が 対象
  12. rem sort.awk がないときには、 set sort=sort などのように設定
  13.  
  14. if "%1" == "" goto pshelp
  15. if "%1" == "file" goto progsortend
  16. : 内蔵ファイルを カレントデレクトリに展開
  17. awk "/^#f /{f=$2;next} /^$/{f=0} f{print>f}"  %0.bat
  18.  
  19. if exist sort.awk set sort=awk -f sort.awk 
  20. if not "%sort%" == "" goto sc
  21. rem ソートできません
  22. goto progsortend
  23.  
  24. :sc
  25. if exist progsort.txt del progsort.txt
  26. if "%1" == "init" del keyw.cfg
  27.  
  28. set idx=%2
  29. :loop
  30. shift
  31. if "%2" == "" goto start
  32. set idx=%idx%,%2
  33. goto loop
  34.  
  35. :start
  36. rem ディフォルトの 対象となる ファイルを書き込む
  37. if "%idx%" == "" set idx=5,6,7,8,9
  38.  
  39. if exist keyw.cfg goto s
  40.  
  41. for %%x in (%idx%) do c:command /c keyw %%x
  42. : type keyw.txt
  43. awk -f keyw.awk keyw.txt > keyw.cfg
  44. del keyw.txt
  45. type keyw.cfg
  46. : pause
  47.  
  48. :s
  49. for %%x in (%idx%) do c:command /c pidx %%x
  50. : awk -f keyco.awk -f pidx.awk *.idx > progsort.txt
  51. : ドライブに余裕があれば [5-9].idx を カレントディレクトリにおいて
  52. : 上の行と置き換え
  53.  
  54. %sort% < progsort.txt > p
  55. awk -f nfch.awk p > progsort.txt
  56. : awk "{printf\"%%1.1s %%4d\",$NF,$(NF-1);for(i=1;i<(NF-1);i++)printf\" %%s\",$i;print\"\" }" p > progsort.txt
  57. : nfch.awk と同等
  58. del p.
  59. awk '{l[$NF]++}END{for(i in l)print i,l[i]}' progsort.txt | awk -f keyco.awk -f keydeprt.awk > keywpat.txt
  60.  
  61. goto progsortend
  62.  
  63.  
  64. --- ここから 必要ファイル
  65.  
  66. #f keyw.bat
  67. if not exist %1.idx lha e fswidx %1.idx
  68. sed '1i#%1;s/^KEYWORD: +/# /;s/ +$//;/^$/q' %1.idx >> keyw.txt
  69. : awk 'BEGIN{ print "#"%1} {sub(/^KEYWORD: +/,"# ");sub(/ *$/,"");print $0} /^$/{exit}' %1.idx >> keyw.txt
  70. : 上の行と同じ sed.exe が いらない
  71. if exist fswidx.lzh del %1.idx
  72.  
  73. #f pidx.bat
  74. if not exist %1.idx lha e fswidx %1.idx
  75. awk -f keyco.awk -f pidx.awk %1.idx >> progsort.txt
  76. if exist fswidx.lzh del %1.idx
  77.  
  78. #f m.bat
  79. :start
  80. if not "%1" == "%r%" goto sr
  81. echo FSW:     %1 %2>> midx.txt
  82. sed -n '%2,/^$/p' %1.idx >> midx.txt
  83. shift
  84. shift
  85. if "%1" == "" goto end
  86. goto start
  87. :sr
  88. if not exist fswidx.lzh goto ss
  89. if exist %r%.idx del %r%.idx
  90. lha e fswidx %1.idx
  91. :ss
  92. set r=%1
  93. goto start
  94. :end
  95. if exist fswidx.lzh del %r%.idx
  96. set r=
  97. type midx.txt
  98.  
  99. #f search.bat
  100. echo off
  101. if "%1" == "v" set v=1
  102. : vi keyw.cfg
  103. awk -v v=%v% -f keyco.awk -f ksearch.awk progsort.txt > search.txt
  104. echo cursol on v
  105. : miel -g search.txt
  106. type search.txt
  107.  
  108. #f keyw.awk
  109. { print }
  110. /^# /{
  111.     c = split($0,m," +")
  112.     for( j = 2 ; j <= c ; j++ ){
  113.         if( m[j] in b ) ;
  114.         else{
  115.             b[ a[++i] = m[j] ]
  116.         }
  117.     }
  118. }
  119. END{
  120.     for( j = 1 ; j <= i ; j++) print a[j]
  121. }
  122.  
  123. #f pidx.awk
  124. FNR == 1 ,/^$/{ next }
  125. /^PRO/{
  126.     sub(/^PROGRAM *: +/,"")
  127.     p = $0
  128.     l = FNR
  129. }
  130. #/^KEY/ && /ツール/ && /データ/ && /TOWNS-OS/{
  131. # 最初から こうしておけば 処理は速いだろうな
  132. /^KEY/{
  133.     for( j = 2 ; j <= NF ; j++ ){
  134.         k[$j]
  135.     }
  136. }
  137. #/^MAK/{
  138. #    sub(/^MAKE *: +/,"")
  139. #    m = $0
  140. #}
  141. /^$/ && p != "" {
  142.     put()
  143. }
  144. END{
  145.     if( p != "" ){ put() }
  146. }
  147. function put(    j,f ){
  148.     f = ""
  149.     for( j = 1 ; j <= kmax ; j++ ){
  150.         f = ( ( ak[j] in k ) ? "1" : "0" ) f
  151.     }
  152.     # print p,m,kco(f),l,FILENAME
  153.     print p,kco(f),l,FILENAME
  154.     p = ""
  155.     for( j in k ) delete k[j]
  156. }
  157.  
  158. #f keyco.awk
  159. BEGIN{
  160.     while( ( getline l < "keyw.cfg" ) > 0 ){
  161.         if( l ~/^#/ || l ~/^$/ ) continue
  162.         split(l,k,"[ \t]+")
  163.         ak[++kmax] = k[1]
  164.         as[  kmax] = k[2]
  165.     }
  166.     for( l in k ) delete k[l]
  167.     nn = 7        # bit 数
  168.     l = 48 + 64   # 6 bit - 64 : 7 bit - 128
  169.     l = 224       # '0' 以降の 全ての半角文字
  170.     for( j = 48 ; j < l ; j++ ){
  171.         if( 127 <= j && j < 161 ) continue
  172.         ss = ss sprintf("%c",j)
  173.     }
  174.     # print ss
  175. }
  176. function kco( b        ,a,i,r ){ # 2 進数文字列 --> $code
  177.     sub(/^0*/,"",b)
  178.     while( ( length(b) % nn ) != 0 ) b = "0" b
  179.     r = ""
  180.     a = 0
  181.     for( i = 1 ; i <= length(b) ; i++ ){
  182.         a = a * 2 + substr(b,i,1)
  183.         if( ( i % nn ) == 0 ){
  184.             r = r substr(ss,a+1,1)
  185.             a = 0
  186.         }
  187.     }
  188.     sub(/^0+/,"",r)
  189.     return ( "$" r )
  190. }
  191. function kde( o     ,r,i,j,a ){ # $code --> 2 進数文字列
  192.     if( substr(o,1,1) != "$" ) return "err"
  193.     r = ""
  194.     for( i = length(o) ; i >= 2 ; i-- ){
  195.         a = index(ss,substr(o,i,1)) - 1
  196.         if( a < 0 ) return "err"
  197.         for( j = 0 ; j < nn ; j++ ){
  198.             r = ( ( a % 2 ) == 0 ? "0" : "1" ) r
  199.             a = int( a / 2 )
  200.         }
  201.     }
  202.     return r
  203. }
  204.  
  205. #f keydeprt.awk
  206. # awk -f keyco.awk -f keydeprt.awk [file]
  207. # echo $code | awk -f keyco.awk -f keydeprt.awk
  208. # [keyword] パターン $code を 展開表示
  209. {
  210.     if( $2 ~/[0-9]/ ){
  211.         printf "%-6s%4d : ", $1, $2
  212.     }else{
  213.         printf "%-6s : ", $1
  214.     }
  215.     f = kde($1)
  216.     for( i = 1 ; i <= length(f) ; i++ ){
  217.         if( substr(f,length(f)-i+1,1) == "1" ) printf "%-11s",ak[i]
  218.     }
  219.     print ""
  220. }
  221.  
  222. #f ksearch.awk
  223. # awk [-v v=1] -f keyco.awk -f ksearch.awk [file|progsort.txt]
  224. # ちょっと(...だいぶん)時間がかかるので覚悟
  225. BEGIN{
  226.     for( i in as ) if( as[i] == "*" ) b++
  227.     usesc["-"] = 1 # not 選択 : red
  228.     usesc["+"] = 3 # or  選択 : yellow
  229.     usesc["*"] = 6 # and 選択 : skyblue
  230.     usesc[""]  = 4 # nop      : blue
  231.     v += 0
  232.     cr[0] = "@"
  233.     cr[1] = "\n"
  234.     printf "\33[1v" > "con" # cursol off
  235. }
  236. {
  237.     f = kde($NF)
  238.     c = d = 0
  239.     for( i = 1 ; i <= length(f) ; i++ ){
  240.         if( substr(f,length(f)-i+1,1) != "1" ) continue
  241.         if( v ) printf "\33[3%dm[%s]\33[m", usesc[as[i]],ak[i] > "con"
  242.         if( as[i] == "-" ){
  243.             printf cr[v] > "con"
  244.             next
  245.         }
  246.         if( as[i] == "*" ) c++
  247.         if( as[i] == "+" ) d++
  248.     }
  249.     printf cr[v] > "con"
  250.     if( b != 0 && b == c || d != 0 ) print
  251. }
  252. END{
  253.     printf "\a\33[0v" > "con" # cursol on & bell
  254. }
  255.  
  256. #f nfch.awk
  257. {
  258.     printf "%1.1s %4d",$NF,$(NF-1)
  259.     for( i = 1 ; i < (NF-1) ; i++ ){
  260.         printf " %s",$i
  261.     }
  262.     print ""
  263. }
  264.  
  265. --- ここまで
  266. note :
  267.    ◇progsort.bat
  268.    progsort.txt keyw.cfg keywpat.txt の作成と関連ファイルの分離だけの
  269.   ものです。本体は、とても小さいです。
  270.    カレントディレクトリに置かなくても、フルパスで呼び出せば、十分です。
  271.    作品名だけの場合なら、
  272.         awk '/^PROG/{f=FILENAME;printf"%1.1s %4d %s\n",f,FNR,$0}' *.idx
  273.    で、すんでしまうのに・・・
  274.  
  275.    ◇[keyword]パターン $code について
  276.    キーワードの設定を2進化し、128進数表現で、表らわしています。
  277.    コード・デコードともに keyw.cfgを使用しています。progsort.txtと一
  278.   緒に作成されたもので、 keyw.cfgのキーワードの順序と数が、変更された
  279.   ときは、正しく変換されません。
  280.      echo $code | awk -f keywco.awk -f keywdeprt.txt
  281.    などで、表示できます。
  282.  
  283.    ◇search.bat [v]
  284.    キーワードでの作品の絞り込みができます。
  285.    keyw.cfg のキーワードの後ろに、スペースまたはタブで、区切って次の
  286.   文字を書き込みます。'#' で始まる行と空行は、無視されます。
  287.         + : or  選択 設定されていれば、選択されます。
  288.         * : and 選択 設定の数と '*' の数が一致すると選択されます。
  289.         - : not 選択 '*','+' にかかわらず選択されません。
  290.    時間はかかりますが、かなり複雑な条件もできます。
  291.    search.txt に結果が返ります。
  292.    v オプションで検索途中のキーワードがみれます。
  293.  
  294.    ◇m.bat [idx],[line] ..
  295.    progsort.txt,search.txt の行頭にあるのが、vol no. 次が、helper.idx 
  296.   での行数です。
  297.         m 5,222 7,3333 8,222 9,1022
  298.    などのようにすれば、それぞれの情報が、midx.txt に格納されます。
  299.  
  300.    ◇sort.awk
  301.    オーム社の本に掲載のマージソートをちょっと改造して、使用しているの
  302.   で、同等のもの、もしくは、 sort.exe などを用意のうえ、
  303.          set sort=sort [opt]
  304.    のように設定してから、実行してください。
  305.    これは、新たに progsort.txt を作るときにだけ、必要です。
  306.  
  307.    ◇fswidx.lzh [5-9].idx
  308.    フリコレの helper.idx をそれぞれリネームして、まとめて冷凍していま
  309.   す。つまり、用意して下さい。
  310.    5 - 9 のときは、ディスク空容量 450KBぐらい必要。
  311.    ディスクに余裕があれば、[5-9].idx をそのままカレントディレクトリに
  312.   おいてください。すべてカレントディレクトリに置くとすれば、1MBぐら
  313.   いの空き容量が必要かと・・・
  314.  
  315.    環境のためのメモリに注意。
  316.  
  317.    このように、バッチファイル中にバッチファイルを書くときには、ラベル
  318.   に注意しないと誤動作の可能性があるので、注意すること。
  319.  
  320.    この展開例では、空行をファイル終了の印にしているので、可読性などの
  321.   ためにあきを入れるためには、 rem 文または、 ':',' ' の行であける。
  322.  
  323.    細かいファイルをひとつのファイルにまとめ、管理しやすくなる。また、
  324.   必要なときにだけ、展開するので、占有クラスタを少なくすることになる。
  325.  
  326.    バッチファイル中に rem 文でなくドキュメントを書く人は、他にはいな
  327.   いんだろうな。
  328.  
  329.    calo / pec01662@niftyserve
  330.  
  331. :pshelp
  332. type %0.bat
  333.  
  334. :progsortend
  335. set idx=
  336. set sort=
  337.